//
//  SSOAuthViewModel.swift
//  SSSina
//
//  Created by ss on 2017/7/2.
//  Copyright © 2017年 ss. All rights reserved.
//

import UIKit
/*
    -VM作用: 帮助OAuthVC请求个数据
            - 帮助OAuthVC数据处理
 
 */

class SSOAuthViewModel: NSObject {
    //全局访问点 单例....
    static let share :SSOAuthViewModel = SSOAuthViewModel()
    //在沙河中获取到保存用户的信息
    var userAccountModel: SSUserAccountModel?
    ///抽取访问令牌(accesstoken, 因为token是有过期时间的 需要只要使用就要判断是否过期)
    var accessToken:String?{
//        //判断userAccountModel 是否为nil
//        if userAccountModel == nil {
//            return nil
//        }else{
            //我们保存了数据了
            //需要判断是否过期
//            if userAccountModel?.expires_Data?.compare(Date()) == ComparisonResult.orderedDescending {
//                return userAccountModel?.access_token
//            }else{
//                //过期了
//                return nil
//            }
        //抽取后
        if userAccountModel?.expires_Data?.compare(Date()) == ComparisonResult.orderedDescending {
            return userAccountModel?.access_token
        }else{
            //过期了
            return nil
        }

    }
    
    //判断用户是否登录
    var isLogin:Bool{
//        //如果 accesstoken 有值,就是没有过期, -登录状态
//        if accessToken != nil {
//            return true
//        }else{
//            //如果为nil就是过期了 ->未登录状态
//            return false
//        }
        return accessToken != nil
    }
    
    //路径
   fileprivate let file = (NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask,true).last! as NSString).appendingPathComponent("userAccount.archiver")
    //重写init方法,完成当前的赋值
    override init() {
        super.init()
        //因为单例的init方法只会调用一次,所以只在沙河中取过一次数据
        userAccountModel = getUserAccountModel()
    }
}

// 帮助控制器请求数据
extension SSOAuthViewModel{
    
    //请求UserAccount
    func getUserAccount(code:String,finish:@escaping (Bool)->()){
        SSNetworkTools.share.oauthLoadUserAccout(code: code, success: { (response) in
            //判断当前响应是否为nil 且是否是一个字典格式
            //guardlet 和 if let 来判断可选值不为Nil 而且是否是我们想要的类型,需要配合as?使用,可能数据不能转成功
            guard let res = response as?[String:Any] else{
                finish(false)
                return
            }
            
            //通过字典转模型
            let userAccountModel = SSUserAccountModel(dic: res)
//            print(userAccountModel)
            //调用请求个人信息方法
            self.getUserInfo(userAccountModel: userAccountModel, finish: finish)
        }) { (error) in
            print(error,"失败")
            finish(false)
            
        }
    }
    
    //请求UserInfo
   private func getUserInfo(userAccountModel: SSUserAccountModel,finish:@escaping (Bool)->()){
        SSNetworkTools.share.oauthLoadUserInfo(userAccountModel: userAccountModel, success: { (response) in
            //判断当前response是否为nil而且是否可以转成一个字典
            guard let res = response as?[String:Any] else{
                finish(false)
                return
            }
            //直接赋值  因为是同一个模型,不能重新创建
            //        let userAccountModel = SSUserAccountModel(dic[String:Any])
            
            //            print("第一次打印",userAccountModel) 有两个参数没有值
            userAccountModel.screen_name = res["screen_name"] as? String
            userAccountModel.avatar_large = res["avatar_large"] as? String
            
            print(userAccountModel)
            
            //通过归档和解档保存数据
            self.saveUserAccountModel(userAccountModel: userAccountModel)
            finish(true)
            
        }) { (error) in
            print(error,"失败")
            finish(false)
        }
        
    }
}

extension SSOAuthViewModel{
    
    /*
     - 使用private修饰方法或者属性的时候,是只能在当前的作用域 ,不管是class, 或者是extension 都是当前的作用域才可以使用private
     - 如果方法或者属性 需要在class外或者是extension中调用,但是还要保证这个方法或者属性外界不可以调用 ,需要使用fileprivate
     
     */
    //保存数据 和获取数据
   fileprivate func saveUserAccountModel(userAccountModel:SSUserAccountModel){
    
        //给单例模型直接赋值 解决第一次调用的时候 单例属性的值是nil的bug,需要手动赋值
        self.userAccountModel = userAccountModel
        NSKeyedArchiver.archiveRootObject(userAccountModel, toFile: file)
    
        
    }
    //获取数据
   func getUserAccountModel() -> SSUserAccountModel?{
        //路径
        let result = NSKeyedUnarchiver.unarchiveObject(withFile: file) as? SSUserAccountModel
        return result
    }
}
